/**
* jquery.purr.js
* Copyright (c) 2008 Net Perspective (net-perspective.com)
* Licensed under the MIT License (http://www.opensource.org/licenses/mit-license.php)
* 
* @author R.A. Ray
* @projectDescription	jQuery plugin for dynamically displaying unobtrusive messages in the browser. Mimics the behavior of the MacOS program "Growl."
* @version 0.1.0
* 
* @requires jquery.js (tested with 1.2.6)
* 
* @param fadeInSpeed 					int - Duration of fade in animation in miliseconds
* 													default: 500
*	@param fadeOutSpeed  				int - Duration of fade out animationin miliseconds
default: 500
*	@param removeTimer  				int - Timeout, in miliseconds, before notice is removed once it is the top non-sticky notice in the list
default: 4000
*	@param isSticky 						bool - Whether the notice should fade out on its own or wait to be manually closed
default: false
*	@param usingTransparentPNG 	bool - Whether or not the notice is using transparent .png images in its styling
default: false
*/

(function ($) {

    $.purr = function (notice, options) {
        // Convert notice to a jQuery object
        notice = $(notice);

        // Add a class to denote the notice as not sticky
        if (!options.isSticky) {
            notice.addClass('not-sticky');
        };

        // Get the container element from the page
        var cont = document.getElementById('purr-container');

        // If the container doesn't yet exist, we need to create it
        if (!cont) {
            cont = '<div id="purr-container"></div>';
        }

        // Convert cont to a jQuery object
        cont = $(cont);

        // Add the container to the page
        $('body').append(cont);

        notify();

        function notify() {
            // Set up the close button
            var close = document.createElement('a');
            $(close).attr(
				{
				    class: 'close',
				    href: '#close',
				    innerHTML: 'Close'
				}
			)
				.appendTo(notice)
					.click(function () {
					    removeNotice();

					    return false;
					}
					);

            // Add the notice to the page and keep it hidden initially
            notice.appendTo(cont)
				.hide();

            if (navigator.userAgent.match(/msie/i) && options.usingTransparentPNG) {
                // IE7 and earlier can't handle the combination of opacity and transparent pngs, so if we're using transparent pngs in our
                // notice style, we'll just skip the fading in.
                notice.show();
            }
            else {
                //Fade in the notice we just added
                notice.fadeIn(options.fadeInSpeed);
            }

            // Set up the removal interval for the added notice if that notice is not a sticky
            if (!options.isSticky) {
                var topSpotInt = setInterval(function () {
                    // Check to see if our notice is the first non-sticky notice in the list
                    if (notice.prevAll('.not-sticky').length == 0) {
                        // Stop checking once the condition is met
                        clearInterval(topSpotInt);

                        // Call the close action after the timeout set in options
                        setTimeout(function () {
                            removeNotice();
                        }, options.removeTimer
						);
                    }
                }, 3000);
            }
        }

        function removeNotice() {
            // IE7 and earlier can't handle the combination of opacity and transparent pngs, so if we're using transparent pngs in our
            // notice style, we'll just skip the fading out.
            if (navigator.userAgent.match(/msie/i) && options.usingTransparentPNG) {
                notice.css({ opacity: 0 })
					.animate(
						{
						    height: '0px'
						},
						{
						    duration: options.fadeOutSpeed,
						    complete: function () {
						        notice.remove();
						    }
						}
					);
            }
            else {
                // Fade the object out before reducing its height to produce the sliding effect
                notice.animate(
					{
					    opacity: '0'
					},
					{
					    duration: options.fadeOutSpeed,
					    complete: function () {
					        notice.animate(
									{
									    height: '0px'
									},
									{
									    duration: options.fadeOutSpeed,
									    complete: function () {
									        notice.remove();
									    }
									}
								);
					    }
					}
				);
            }
        };
    };

    $.fn.purr = function (options) {
        options = options || {};
        options.fadeInSpeed = options.fadeInSpeed || 500;
        options.fadeOutSpeed = options.fadeOutSpeed || 500;
        options.removeTimer = options.removeTimer || 4000;
        options.isSticky = options.isSticky || false;
        options.usingTransparentPNG = options.usingTransparentPNG || false;

        this.each(function () {
            new $.purr(this, options);
        }
		);

        return this;
    };
})(jQuery);

